Java桥梁设计模式优雅地将抽象与实现分离

 更新时间:2023年04月22日 08:39:15   作者:.番茄炒蛋  
Java桥接设计模式通过将抽象和实现分离,使得它们可以独立地变化,从而实现更灵活的代码结构。它是一种优雅的设计模式,适用于需要处理多个变化因素的复杂应用程序

介绍

Java桥梁模式(也称桥接模式)(Bridge Pattern)是一种设计模式,它将抽象和实现分离,使它们可以独立地变化.它通过一个大类或者一系列紧密关联的类拆分成两个独立的层次结构来实现这种分离,其中一个层次结构包含抽象类或接口,另一个层次结构包含实现类.桥梁模式使得抽象类和实现类可以独立地变化,从而实现了松耦合.

在Java中,桥梁模式通常使用接口来定义抽象部分,使用抽象类来实现部分实现,并将它们通过组合的方式组合起来.抽象部分包含一个只想实现部分的引用,实现部分实现了抽象部分定义的接口.

Java桥梁模式分为以下四种角色:

  • 抽象化角色(Abstraction):定义抽象化的接口,维护一个指向实现化对象的引用.
  • 扩展抽象化角色(Refined Abstraction):扩展抽象化角色,通常是抽象化角色的子类,实现抽象化角色中的业务方法.
  • 实现化角色(Implementor):定义实现化角色的接口,这个接口不一定要与抽象化角色的接口完全一致,事实上,这两个接口可以完全不同.
  • 具体实现化角色(Concrete Implementor):具体实现化角色实现实现化角色接口,并完成具体的业务逻辑.

实现

例如,在电商网站中,可能需要支持多种支持方式,如支付宝,微信支付和银联支付等.使用桥梁模式可以轻松地添加或切换不同的支付方式,以满足用户的需求.

实现化角色

public interface PaymentImplementor {
    /**
     * 支付
     *
     * @param amount
     */
    void processPayment(double amount);
}

具体实现化角色

public class AliPaymentImplementor implements PaymentImplementor {
    /**
     * 支付
     *
     * @param amount
     */
    @Override
    public void processPayment(double amount) {
        System.out.println("支付宝支付:" + amount + "元...");
    }
}
public class WechatPaymentImplementor implements PaymentImplementor {
    /**
     * 支付
     *
     * @param amount
     */
    @Override
    public void processPayment(double amount) {
        System.out.println("微信支付:" + amount + "元...");
    }
}
public class UnionpayPaymentImplementor implements PaymentImplementor {
    /**
     * 支付
     *
     * @param amount
     */
    @Override
    public void processPayment(double amount) {
        System.out.println("银联支付:" + amount + "元...");
    }
}

抽象化角色

public abstract class Payment {
    protected PaymentImplementor implementor;
    public Payment(PaymentImplementor implementor) {
        this.implementor = implementor;
    }
    /**
     * 支付
     *
     * @param amount
     */
    public abstract void pay(double amount);
}

扩展化抽象角色

public class OnlinePayment extends Payment{
    public OnlinePayment(PaymentImplementor implementor) {
        super(implementor);
    }
    /**
     * 支付
     *
     * @param amount
     */
    @Override
    public void pay(double amount) {
        System.out.println("开始在线支付...");
        implementor.processPayment(amount);
        System.out.println("在线支付完成...");
    }
}

测试

public class Demo {
    public static void main(String[] args) {
        // 支付宝支付
        PaymentImplementor paymentImplementor = new AliPaymentImplementor();
        Payment payment = new OnlinePayment(paymentImplementor);
        payment.pay(100);
        System.out.println();
        // 微信支付
        paymentImplementor = new WechatPaymentImplementor();
        payment = new OnlinePayment(paymentImplementor);
        payment.pay(101);
        System.out.println();
        // 银联支付
        paymentImplementor = new UnionpayPaymentImplementor();
        payment = new OnlinePayment(paymentImplementor);
        payment.pay(102);
    }
}

这段代码是一个简单的实现了桥梁模式的示例.其中,Payment是抽象类,OnlinePayment是其子类,PaymentImplementor是接口,AliPaymentImplementor,UnionpayPaymentImplementor和WechatPaymentImplementor都是其实现类.通过这种方式,Payment类PayImplementor接口被解耦,可以独立地发展和扩展.

在这个示例中,Payment类是抽象化,不能被实例化,而是通过OnlinePayment子类进行实例化.OnlinePayment子类重写了pay方法,并调用implementor.processPayment方法,该方法由实现PaymentImplementor接口的类来是心啊,例如,AliPaymentImplementor,UnionpayPaymentImplementor和WechatPaymentImplementor.这种方式使得PaymentImplementor接口的实现类可以动态地注入到OnlinePayment类中,从而实现了不同的支付方式,而不需要修改OnlinePayment类.

总结

优点

  • 分离抽象和实现部分,使得它们可以独立变化,从而增加了系统的灵活性和可扩展性.
  • 通过抽象接口来管理对象之间的关系,更加符合面向对象编程的原则,使得系统更加易于维护和理解.
  • 桥梁模式可以避免使用继承造成的类爆炸问题,因为它似乎用了组合关系.

缺点

  • 桥梁模式增加了系统的复杂性,需要额外的抽象层,可能会导致系统的设计变得复杂.
  • 如果不恰当地设计桥梁接口和实现类,可能会导致系统的耦合度增加.

应用场景

  • 当一个类具有多个变化维度(例如,一个形状类有不同的颜色和尺寸)时,可以使用桥梁模式来将它们分离开来,从而使得系统更加灵活.
  • 当需要支持不同平台,数据库或协议时,可以使用桥梁模式来封装这些实现细节,使得客户端和实现部分可以独立变化,而不影响彼此.
  • 当需要运行时动态地切换实现时,可以使用桥梁模式来实现这种切换.

到此这篇关于Java桥梁设计模式优雅地将抽象与实现分离的文章就介绍到这了,更多相关Java桥梁设计模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java数据结构中堆的向下和向上调整解析

    Java数据结构中堆的向下和向上调整解析

    堆是一颗完全二叉树,在这棵树中,所有父节点都满足大于等于其子节点的堆叫大根堆,所有父节点都满足小于等于其子节点的堆叫小根堆。堆虽然是一颗树,但是通常存放在一个数组中,父节点和孩子节点的父子关系通过数组下标来确定
    2021-11-11
  • Springboot中的三个基本架构

    Springboot中的三个基本架构

    这篇文章主要介绍了Springboot中的三个基本架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring实现文件上传(示例代码)

    Spring实现文件上传(示例代码)

    Spring可以继承commons-fileupload插件来实现文件上传的功能。分为前端JSP编写和后台Controller的编写
    2013-10-10
  • 关于MVC的dao层、service层和controller层详解

    关于MVC的dao层、service层和controller层详解

    这篇文章主要介绍了关于MVC的dao层、service层和controller层详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java synchronized同步静态方法和同步非静态方法的异同

    java synchronized同步静态方法和同步非静态方法的异同

    这篇文章主要介绍了java synchronized同步静态方法和同步非静态方法的异同的相关资料,需要的朋友可以参考下
    2017-01-01
  • springboot jsp支持以及转发配置方式

    springboot jsp支持以及转发配置方式

    文章介绍了如何在Spring Boot项目中配置和使用JSP,并提供了一步一步的指导,包括添加依赖、配置文件设置、控制器和视图的使用
    2024-12-12
  • SpringBoot+Jersey跨域文件上传的实现示例

    SpringBoot+Jersey跨域文件上传的实现示例

    在SpringBoot开发后端服务时,我们一般是提供接口给前端使用,本文主要介绍了SpringBoot+Jersey跨域文件上传的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 浅析Spring 中 Bean 的理解与使用

    浅析Spring 中 Bean 的理解与使用

    这篇文章主要介绍了Spring 中 Bean 的理解与使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 基于MapperXML扫描的问题

    基于MapperXML扫描的问题

    这篇文章主要介绍了MapperXML扫描的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 关于Spring启动流程及Bean生命周期梳理

    关于Spring启动流程及Bean生命周期梳理

    这篇文章主要介绍了关于Spring启动流程及Bean生命周期梳理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论